// cmd/main.go
package main

import (
	"fmt"
	"gozrd-admin-api/pkg/redis"
	"log"

	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	"gozrd-admin-api/internal/api"
	"gozrd-admin-api/pkg/database"
	"gozrd-admin-api/pkg/logger"
	"gozrd-admin-api/pkg/middleware"
)

// @title Gozrd Admin API
// @version 1.0
// @description 管理系统API文档
// @termsOfService http://swagger.io/terms/

// @contact.name API支持
// @contact.url http://www.example.com/support
// @contact.email support@example.com

// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @host localhost:8080
// @BasePath /api/v1
func main() {
	// 初始化配置
	if err := initConfig(); err != nil {
		log.Fatalf("初始化配置失败: %v", err)
	}

	// 初始化数据库连接
	db, err := database.InitMySQL()
	if err != nil {
		log.Fatalf("初始化数据库连接失败: %v", err)
	}

	sqlDB, _ := db.DB()
	defer sqlDB.Close()

	// 初始化Redis连接
	redis_cli, err := redis.InitRedis()
	if err != nil {
		log.Fatalf("初始化Redis连接失败: %v", err)
	}
	defer redis_cli.Close()

	// 初始化日志
	logger.InitLogger()

	// 创建Gin引擎
	r := gin.Default()

	// 注册中间件
	r.Use(middleware.Cors())
	r.Use(middleware.RequestMemoryMonitor()) // 使用每请求内存监控
	r.Use(middleware.TraceID())
	r.Use(middleware.Logger())
	r.Use(gin.Recovery())

	// 注册路由, 数据库, redis
	api.RegisterRoutes(r, db, redis_cli)

	// 启动服务器
	port := viper.GetString("server.port")
	log.Printf("服务开始运行在 http://localhost:%s", port)
	if err := r.Run(fmt.Sprintf(":%s", port)); err != nil {
		log.Fatalf("启动服务器失败: %v", err)
	}
}

func initConfig() error {
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	if err := viper.ReadInConfig(); err != nil {
		return err
	}

	return nil
}
